{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2.2 IPython基础\n",
    "\n",
    "# 1 Running the IPython Shell （运行IPython Shell）\n",
    "\n",
    "可以通过命令行启动IPython，就像启动标准的Python解释器一样，直接在terminal中键入ipython，回车即可。因为这里我用的是Jupyter Notebook，默认其实就是ipython。所以为了模仿在terminal中打开ipython的场景，前面加了一个！的命令。不过这个命令会让Jupyter Notebook一直处于busy状态，所以没必要真正运行。不过要是运行了的话，可以通过Jupyter中Kernel里的Interrupt来打断。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Python 2.7.12 |Anaconda 4.1.1 (x86_64)| (default, Jul  2 2016, 17:43:17) \n",
      "Type \"copyright\", \"credits\" or \"license\" for more information.\n",
      "\n",
      "IPython 4.2.0 -- An enhanced Interactive Python.\n",
      "?         -> Introduction and overview of IPython's features.\n",
      "%quickref -> Quick reference.\n",
      "help      -> Python's own help system.\n",
      "object?   -> Details about 'object', use 'object??' for extra details.\n",
      "\n",
      "\u001b[0;34mIn [\u001b[1;34m1\u001b[0;34m]: \u001b[0m^C\n",
      "KeyboardInterrupt\n",
      "\n",
      "\u001b[0;34mIn [\u001b[1;34m1\u001b[0;34m]: \u001b[0m\n",
      "\n",
      "\u001b[0;34mIn [\u001b[1;34m1\u001b[0;34m]: \u001b[0m"
     ]
    }
   ],
   "source": [
    "!ipython"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from numpy.random import randn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{0: -0.6878488995702015,\n",
       " 1: 0.3111764791766575,\n",
       " 2: -0.4951873499757597,\n",
       " 3: 0.1317607911255136,\n",
       " 4: -0.044484140124262925,\n",
       " 5: -1.2855719508755052,\n",
       " 6: -0.2073767192524388}"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = {i: randn() for i in range(7)}\n",
    "\n",
    "data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "因为我们用的是ipython，所以上面输出的字典对象可读性很好，每行一个key对应一个value。但如果是在标准的Python解释器里打印上面的字典的话，可读性就会变差了，比如输出会是\n",
    "```\n",
    "{0: -0.6878488995702015, 1: 0.3111764791766575, 2: -0.4951873499757597, 3: 0.1317607911255136, 4: -0.044484140124262925, 5: -1.2855719508755052, 6: -0.2073767192524388}\n",
    "```\n",
    "这样的结果很不方便查看。\n",
    "\n",
    "# 2 Running the Jupyter Notebook（运行Jupyter Notebook）\n",
    "\n",
    "译者：这个系列的所有笔记都是用Jupyter Notebook来写的，这个工具在数据分析方面真得非常好用，建议大家好好学习一个这个工具。书中用了很多图片来说明，这里我就不进行翻译了，直接推荐一些优秀的教程：\n",
    "\n",
    "blog：http://codingpy.com/article/getting-started-with-jupyter-notebook-part-1/\n",
    "\n",
    "如果blog看得不懂的话，推荐墙外的朋友直接上Youtube搜索'Jupyter tutorial'，上面有很多非常棒的视频教程，一步步来总能学会的。如果没法翻墙的话，可以直接在bilibili上搜索'Jupyter notebook'。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3 Tab Completion（Tab键自动补全）\n",
    "\n",
    "只要按下tab键，当前命名空间中任何与已输入的字符串相匹配的变量（对象，函数）就会被找出来："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "an_apple = 27\n",
    "an_example = 42"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "an<Tab>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上面的`<Tab>`不是输入，只是一个按键说明。除了定义的an_apple和an_example外，我们会看到还有Python关键字and和内置函数any。\n",
    "\n",
    "当然，我们也可以在任何对象后面输入一个句点以便自动补全**方法**和**属性**的输入："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "b = [1, 2, 3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "b.<Tab>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "还可以用在模块上："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import datetime"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "datetime.<Tab>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "除了命名空间，对象或模块属性。还可以输入任何看上去像是文件路径的东西"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "../datasets/<Tab>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "path = '../datasets/<Tab>'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "再结合`%run`命令（之后会介绍），该功能可以减少敲击键盘的次数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Tab自动补全还可以用于函数关键字参数（包括等号=）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4 Introspection（内省）\n",
    "\n",
    "在变量的前面或后面加上一个问号`?`，就可以讲有关该对象的一些通用信息显示出来："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "b?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这个功能叫做对象内省（object introspection)。如果该对象是一个函数或实例方法，则其docstring也会被显示出来："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def add_number(a, b):\n",
    "    \"\"\"\n",
    "    Add two nummbers together\n",
    "    \n",
    "    Return\n",
    "    ------\n",
    "    the_sum: type of arguments\n",
    "    \"\"\"\n",
    "    return a + b"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "然后利用？来显示上面函数中的docstring："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "add_number?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "使用？？还能显示出该函数的源代码："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "add_number??"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "?还有一个用法，即搜索IPython命名空间。一个写字符再配以通配符`*`，即可显示出所有与该通配符表达式相匹配的名称。\n",
    "\n",
    "例如，我们可以留出Numpy顶级命名空间中含有“load”的所有函数："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "np.*load*?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5 The %run Command (%run命令）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在IPython会话环境中，所有文件都可以通过%run命令当做Python程序来运行。假设我们在ipython_script_test.py中写了一段简单的脚本，如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def f(x, y, z):\n",
    "    return (x + y) / z\n",
    "\n",
    "a = 5\n",
    "b = 6\n",
    "c = 7.5\n",
    "\n",
    "result = f(a, b, c)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "只要将文件名传给%run就可以运行了："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ERROR:root:File `'ipython_script_test.py'` not found.\n"
     ]
    }
   ],
   "source": [
    "%run ipython_script_test.py\n",
    "# 这里假设ipython_script_test.py在当前路径"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "执行之后，ipython_script_test.py文件中的所有变量也都可以直接访问了"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "7.5"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.4666666666666666"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "result"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "如果Python脚本需要用到命令行参数（通过sys.argv访问），可以将参数放到文件路径的后面，就像在命令行上执行那样。\n",
    "\n",
    "### Interrupting running code （中断正在执行的代码)\n",
    "\n",
    "任何代码在执行时，只要按下“Ctrl-C”，就会应发一个KeyboardInterrupt。绝大部分情况下，python程序都将立即停止执行。\n",
    "\n",
    "# 6 Executing Code from the Clipboard （执行剪贴板中的代码)\n",
    "\n",
    "在IPython中执行代码最简单的方式是粘贴剪贴板中的代码。比如我们希望一段一段地执行脚本，以便查看各个阶段所加载的数据以及产生的结果。\n",
    "\n",
    "多数情况下，我们能用“Ctrl-Shift-V”讲剪贴板中的代码片段粘贴出来。但这不是万能的。因为这种粘贴方式模拟的是在IPython中逐行输入代码，换行符会被处理成`<return>`，也就是说，如果代码中有所进，且有空行，IPython会认为缩进在空行哪里结束了。当执行到缩进块后面的代码时，会引发一个IndentationError。例如下面这段代码："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x = 5\n",
    "y = 7\n",
    "if x > 5:\n",
    "    x += 1\n",
    "    \n",
    "    y = 8"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "直接粘贴是不行的。（具体的效果大家可以打开terminal，直接试一下。不过这里因为版本的缘故，不会出现书中的错误提示）\n",
    "\n",
    "![失败的粘贴](https://ws2.sinaimg.cn/large/006tKfTcgy1fkqxqp5hvdj306g05r0ss.jpg)\n",
    "\n",
    "但我们可以利用%paste和%cpaste这两个魔术函数。%paste可以承载剪贴板中的一切文本，并在shell中以整体形势执行：\n",
    "\n",
    "![%paste的粘贴](https://ws2.sinaimg.cn/large/006tKfTcgy1fkqxsfhbmvj306s05iglp.jpg)\n",
    "\n",
    "这里要注意一点，先把复制代码，然后在terminal中输入%paste回车。这个命令会自动执行剪贴板上复制的内容。\n",
    "\n",
    "%cpaste和%paste差不多，只不过它多出一个用于粘贴代码的特殊提示符而已：\n",
    "\n",
    "![%cpaste的粘贴](https://ws2.sinaimg.cn/large/006tKfTcgy1fkqxwerc2ej30gm05y3yr.jpg)\n",
    "\n",
    "建议一直使用%cpaste，因为你可以自己决定是否执行代码，想粘贴多少粘贴多少。\n",
    "\n",
    "## IPython、编辑器、IDE之间的交互\n",
    "\n",
    "书中说到了PyDev plugin for Eclipse和Python Tools for Visual Studio，都继承了IPython终端应用程序。这里译者只推荐PyCharm，非常强大且易用的IDE。\n",
    "\n",
    "# 7 Terminal Keyboard Shortcuts（terminal键盘快捷键）\n",
    "\n",
    "这里我直接贴出来书中的讲解。因为我的terminal集成了tmux，一些快捷键和IPython有冲突，所以快捷键我并没有怎么用到。\n",
    "\n",
    "![快捷键](https://ws3.sinaimg.cn/large/006tKfTcgy1fkqy42b68sj30j50hgwil.jpg)\n",
    "\n",
    "如果对于tmux感兴趣的话，可以看我写的另一个教程，集成了tmux后的terminal会变得更易用：[tmux简洁教程及config关键配置](http://www.jianshu.com/p/fd3bbdba9dc9)\n",
    "\n",
    "\n",
    "## 异常和跟踪\n",
    "\n",
    "如果%run某段脚本或执行某条语句时发生了异常，IPython默认会输出整个调用栈跟踪（traceback），其中还会富商调用栈个点附近的几行代码作为上下文参考。\n",
    "\n",
    "# 7 About Magic Commands（关于魔术命令)\n",
    "\n",
    "Magic Command，这些命令能提供便利。这些命令是以%为前缀的。例如，可以通过%timeit这个magic command来检测任意python语句的执行时间："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "a = np.random.randn(100, 100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The slowest run took 81.37 times longer than the fastest. This could mean that an intermediate result is being cached.\n",
      "10000 loops, best of 3: 77 µs per loop\n"
     ]
    }
   ],
   "source": [
    "%timeit np.dot(a, a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "magic command可以看做云星宇IPython系统中的命令行程序。他们大都还有一些“命令行萱萱”，使用？查看其选项："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "%reset?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "魔术命令默认是可以不带百分号使用的，只要没有定义与其同名的变量即可。这个技术叫做automagic,可以通过%automagic打开或关闭\n",
    "\n",
    "这里列几个比较重要的magic command\n",
    "\n",
    "![IPython magic command](https://ws2.sinaimg.cn/large/006tKfTcgy1fkr1i9kbcij30jf0na0yr.jpg)\n",
    "\n",
    "# 8 Matplotlib Integration（Matplotlib整合）\n",
    "\n",
    "其实上面我们也用到了，通过使用magic command `%matplotlib`能够直接在jupyter中画图。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x1061b6320>]"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgcAAAFkCAYAAAC0KZhSAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3XeYVdW5x/HvogmKVBEBkRIL2JCZUZmIRgQkKogllrEl\nqDcxUaMolhijxpuE2OvVJHotWMYYC0SHRMUS7OiMojQF6SCKgAMiUoZ1/3jnXGbGKafsffYpv8/z\nnOfAmXP2Xuxh5rxnrfd9l/PeIyIiIhLTLOoBiIiISGZRcCAiIiK1KDgQERGRWhQciIiISC0KDkRE\nRKQWBQciIiJSi4IDERERqUXBgYiIiNSi4EBERERqUXAgIiIitYQWHDjnrnLOvemcW++cWx3WeURE\nRCRYYc4ctASeBO4N8RwiIiISsBZhHdh7/3sA59xPwzqHiIiIBE85ByIiIlJLaDMHyXDOdQZGAAuB\n76IdjYiISFZpDfQGXvDer0rlQAkFB8658cAVjTzFA/29958mOZ4RwGNJvlZERETgdODxVA6Q6MzB\nzcCDTTxnfpJjAZsxYMKER9lnn/4pHEYSMXbsWG677baoh5FXdM3TT9c8/XTN02v27NmcccYZUP1e\nmoqEgoPqaYqUpiqa8B1A69b9KSgoCPE0UlP79u11vdNM1zz9dM3TT9c8Mikvy4eWc+Cc6wl0AnoB\nzZ1zA6q/NM97v76x186ZE9aoREREpClhJiReD5xV4+8V1fdDgKmNvXD27LCGJCIiIk0JrZTRez/G\ne9+8nlujgQEoOBAREYlSRvY5mDMHqqqiHkX+KCkpiXoIeUfXPP10zdNP1zx7Oe991GP4f865AqAc\nypk9u4B+/aIekYiISHaoqKigsLAQoNB7X9HU8xuTkTMHAOXlUY9AREQkP2VkcNCjh4IDERGRqGRk\ncNC/v4IDERGRqGRkcNCvH3zwAWzdGvVIRERE8k9GBgf9+8O6dTBvXtQjERERyT8ZGRzEqhS0tCAi\nIpJ+GRkcdOgAvXsrOBAREYlCRgYHAAUFUJFSlaaIiIgkI2ODg8JCCw4yqEeTiIhIXsjo4KCyEj77\nLOqRiIiI5JeMDQ5iW4BraUFERCS9MjY46NIFevZUUqKIiEi6ZWxwALa0oOBAREQkvTI+OFBSooiI\nSHpldHBQUABr1sDChVGPREREJH9kdHBg21JraUFERCSdMjo46NpV2zeLiIikW0YHB6CkRBERkXTL\n+OAg1kZZSYkiIiLpkfHBQWEhrFoFixdHPRIREZH8kBXBAWhpQUREJF0yPjjo1s1uCg5ERETSI+OD\nA9D2zSIiIumUFcFBrGJBSYkiIiLhy5rgYOVKWLo06pGIiIjkvqwIDrR9s4iISPqEEhw453o55+53\nzs13zn3rnJvrnLvOOdcymeP16AE776ykRBERkXRoEdJx+wEO+C/gM2Bf4H5ge+DyRA/mnDolioiI\npEsoMwfe+xe89+d471/23i/03j8P3AyckOwxlZQoIiKSHunMOegArE72xQUF8MUX8PnnAY5IRERE\nvictwYFzbnfgAuAvyR5DnRJFRETSI6GcA+fceOCKRp7igf7e+09rvKYH8C/g7977B+I5z9ixY2nf\nvn2tx049tYSddiqhvBxGjUpk1CIiIrmltLSU0tLSWo9VVlYGdnznE1jEd851Bjo38bT53vst1c/v\nDrwKvOW9HxPH8QuA8vLycgpi9Ys1jBgBrVrBc8/FPWQREZG8UFFRQaFNsxd671Mq/k9o5sB7vwpY\nFc9zq2cMXgHeA85OfGjfV1gIDz8cxJFERESkIWH1OegOvAYswkoXd3bOdXXOdU3luIWFsHw5rFgR\nwCBFRESkXmElJA4H+gJDgSXAcuDz6vukKSlRREQkfGH1OXjYe9+8zq2Z9755Ksft1Qs6dlRwICIi\nEqas2FshJtYpUXssiIiIhCerggNQG+VETJgACxdGPQoREck2WRccHHywbd08d27UI8lsVVVwzjnw\nQFydJURERLbJuuDgxz+G9u1V0tiU5cthyxZYsCDqkYiISLbJuuCgTRs49VQLDqqqoh5N5lq0yO4V\nHIiISKKyLjgAGDPGlhZeeSXqkWSuxYvtfv78aMchIiLZJyuDg4MOgn794MEHox5J5orNHHz+OWzY\nEO1YREQku2RlcOCczR48+yx8/XXUo8lMixbZdQJVLIiISGKyMjgAOPNM2LwZ/v73qEeSmRYvhoED\n7c/KOxARkURkbXDQrZtVLmhpoX6LFkFxMbRsqeBAREQSk7XBAcDPfgbvvguzZ0c9kszivQUHffpA\n795KShQRkcRkdXAwahR06gQPPRT1SDLL6tWwfr3tRdGnj2YOREQkMVkdHGy3HZx+urUJ3rIl6tFk\njlgZ4267WXCgmQMREUlEVgcHYFULK1bACy9EPZLMEStj7NUL+va1mQPvox2TiIhkj6wPDg44APbf\nX4mJNS1aBK1bw84728zB2rWwZk3UoxIRkWyR9cFBrOfBP/8Jq1ZFPZrMsGiRLSk4ZzMHoKUFERGJ\nX9YHB2B5B97D449HPZLMsHixBQdgMwegpEQREYlfTgQHXbpY5YKWFsyiRZZvANCxI7Rrp5kDERGJ\nX04EB2A9Dz74AKZPj3ok0asZHMSWFjRzICIi8cqZ4OCooywBL997Hnz7LaxcuS04AJUziohIYnIm\nOGjZ0vZbePRR2LQp6tFEZ8kSu4/lHIBmDkREJDE5ExyALS189RVMnhz1SKJTs8dBTJ8+9nhVVTRj\nEhGR7JJTwcG++0JRUX4nJi5aBM2awa67bnusb1/bwXLZsujGJSIi2SOnggOwngdlZfDFF1GPJBqL\nF0P37rbMEqNyRhERSUTOBQclJdC8ueUe5KNYA6Saeve2eyUliohIPHIuOOjYEY47zqoW8nE/gZpl\njDGtW9tsgmYOREQkHjkXHIAtLcyYAa++GvVI0q++4AC0dbOIiMQvtODAOTfJObfIObfBObfcOTfB\nOdctrPPVNHw4HHIIjB4Nr7ySjjNmhqoqWLq0/uCgb18tK4iISHzCnDl4BTgJ2BM4AfgB8I8Qz/f/\nmje3LZwPOcSaI02cmI6zRm/5cgsQ6uYcgGYOREQkfqEFB977O7z307z3S7z37wB/BgY555qHdc6a\ndtjBdmo8/ng48cT8KG+sr8dBTJ8+8PnnsGFDesckIiLZp0U6TuKc6wScDrzpvU9bK55WreCxx6BD\nBzj7bFi9Gi69NF1nT7/GgoPY1s0LF0L//mkbkoiIZKFQExKdc392zn0DfAX0BI4L83z1ad4c7r0X\nfvtbGDcOrroqd6sYFi+GTp2gbdvvfy3W60B5ByIi0pSEggPn3Hjn3NZGblXOuT1rvORG4ABgOFAF\nPBLg2BMYN/zhD3DLLTB+PPzyl7nZSri+Hgcx3bvbTIryDkREpCmJLivcDDS1ev//n02996uB1cA8\n59wcYIlz7mDv/buNHWDs2LG0b9++1mMlJSWUlJQkONzaLrnE+iCcey6sWQOPPGJvmLmioTJGsBmU\nXr0UHIiI5ILS0lJKS0trPVZZWRnY8Z1P0xy7c243YCFwuPd+agPPKQDKy8vLKSgoCG0sEyfCKafA\n4YfDM89Y8mIu2HtvK+O84476vz5iBGy/PTz7bHrHJSIi4auoqKCwsBCg0HtfkcqxQsk5cM4d5Jw7\n3zk3wDm3m3PuCOBxYC7wdhjnTMRxx8G//w1vvQUXXRT1aILhveUcNDRzANq6WURE4hNWQuK3WG+D\nKcAc4D7gQ2zWYHNI50zIkCFw4YVW7rh1a9SjSd3q1bB+fcM5B2BJifPn525CpoiIBCOU4MB7P8N7\nP9R738V7v733/gfe+wu895+Hcb5kHXkkrFwJH34Y9UhS11gZY0zfvrBunQUSIiIiDcnJvRXi9cMf\nWtnfCy9EPZLUxRMcaOtmERGJR14HB61a2fJCLgQHixfb7otdujT8nFgjJPU6EBGRxuR1cACWwf/m\nmzbdns1iPQ6ca/g5HTtC+/aaORARkcYpOBgBW7Zk//bOjfU4qCmWlBi0+fMtOMmnXTBFRHJV3gcH\nu+9u0+0vvhj1SFLTVBljTBjljBs3Wt+IJUvgpZeCPbaIiKRf3gcHYLMH2Z53EOXMwZVXwvTpsM8+\n8P77wR5bRETST8EBVtI4b172Jup9+62VZDbW4yCmb1+bZQhqb4lJk+D22+Hmm+HUUy04UB8FEZHs\npuAAOOIIaNEie2cPFi+2+3hnDjZvhmXLUj/vokXws59Zx8kLL4SiIvj6a/jss9SPLSIi0VFwALRr\nB8XF+RMcQOqzJJs320xB+/bwwANWJVFUZF/T0oKISHZTcFBtxAjLtN+cEc2dE7NoETRrBj16NP3c\n3r3tPtWkxKuvtiDgiSesRBJgp53s+AoORESym4KDaiNGWK+DtyPfFipxixZB9+7QsmXTz23d2p6b\nyszB5Mlw440wfjwMGlT7a0VFCg5ERLKdgoNqBQX2yTcblxbirVSISaWccelSOOssOOYYuOSS73+9\nqAjKy3NjMysRkXyl4KBas2YwfHh29juIt8dBTLLljFu2wGmn2ezDQw/ZNaurqAi++QY+/TTx44uI\nSGZQcFDDkUfap96vvop6JIlJ18zBddfBW29ZnsFOO9X/nIICu9fSgohI9lJwUMORR1qNfjZ1+duy\nxab64+lxENOnD6xYYf0R4vXSS/CnP8H118PgwQ0/r2NH6zr53nvxH1tERDKLgoMauneH/fbLrryD\n5cutoVGiywoACxfG9/wvvoAzzoBhw6wbYlMOPFAzByIi2UzBQR0jRljeQbZ0+Uukx0FMbOvmeJcW\n/vhHK/F85JH68wzqKiqCDz6wWQ0REck+Cg7qGDECPv8cPv446pHEZ9Eiu09kWaF7d2jVKr6kxBUr\n4L77YOxY6No1vuMXFcGGDTB7dvxjEhGRzKHgoI7Bg6FNm+xZWli0CDp1grZt439Ns2bWrCiemYNb\nb7VA4sIL4z/+wIHWMVFLCyIi2UnBQR2tW8Phh2dXcJDIkkJMnz5NBwerVsE998AFF0CHDvEfe8cd\noV8/BQciItlKwUE9jjwSXn89sWz+qCTa4yAmnl4Hd9xhuRcXX5z48YuKVLEgIpKtFBzUY8QI2LQJ\n/vOfqEfStGRnDmK9DhpKvKyshDvvhPPOgy5dEj9+URFMn27XUUREsouCg3r06wc9e2b+0oL3Fhwk\nkowY06eP7SWxalX9X7/7bvjuOxg3LrmxHXigBQYzZiT3ehERiY6Cg3o4Z7MHmR4crF5tSx/JzhxA\n/XkH33wDt90G554L3bolN7YBA6B5c+UdiIhkIwUHDRgxAubM2dZHIBPFyhiTzTmA+vMO/vpXW1a4\n/PLkx7b99rDPPgoORESykYKDBgwdaiV/mTx7kEpw0LEjtG///ZmDDRvg5pvhpz9NbrmiJm3fLCL5\n7P77bVv7bNzQT8FBAzp2hIMPzvzgoE2bhjdBakp9GzA98AB8+WV8bZKbUlRkzaS++y71Y4mIZJu/\n/Q0++shmokeOtNnobKHgoBEjRsCUKZnbBnjxYvt071xyr69bzrhpE9xwA5SU2OZJqSoqsms3fXrq\nxxIRySYrVlg591/+Av/4B8ycaXv3XHSR5YtlutCDA+dcK+fch865rc65/cM+X5COPNLW3jO1Xj/Z\nMsaYujMHjzwCS5bAVVelPjaA/feHli21tCAi+WfyZPvgdtRR8JOfWDv5P/wBHnzQPnzdeaftWZOp\n0jFzcCOwFMiSrYy2OfBA6wyYqUsLqQYHffrYMaqq7BP++PFw4omw997BjG+77SxSVnAgIvnm+ect\n3yDWJ6Z1a7jiCpg714KFiy+2349lZZm50V+owYFz7ihgODAOSHLyOzotWtg2xZkcHKSSNNi3rwUF\nS5fC3/8On30Gv/1tcOMDbd8sIvln40Z46SXLM6ira1fLRaiosE3wRo6EY46xZPBMElpw4JzrCvwN\nOAPIsH92/I49Ft55J/MSSb79Fr76KvWZA7Cg4I9/tP+kAwcGM76YoiKYNQvWrw/2uCIimWrqVOsX\nc8wxDT/ngAPg5ZctH+Ff/4Lnnkvf+OIR5szBg8A93vsPQjxH6E4+2RoB3XJL1COpLdZ/IZXgIPba\nW26x9bCgZw3AgoOtW+HDD4M/tohIJnr+edh1V8u7aoxztsRQVGSzt5kkoeDAOTe+OrGwoVuVc25P\n59yvgbbADbGXBj7yNNluO/j1r2HCBMs+zRSp9DiIad0aevSwxJlhw2x9LGj77GPXMFOTOkVEguS9\nBQcjR8ZfSXbKKfZ7eN26cMeWiBYJPv9mbEagMQuAIUAxsNHVvjrvO+ce896PaewAY8eOpX379rUe\nKykpoaSkJMHhBuO882za/e67Lds0EyxaZE2aundP7Th9+sCyZXD11cGMq66WLW36THkHIpIPPvnE\nSsTryzdoyEknwWWX2dLCaafF95rS0lJKS0trPVZZWZnASBvnfAhpks65XYF2NR7qDrwAnAhM894v\nb+B1BUB5eXk5BQUFgY8rFWPHwsMP23R+27ZRj8bezCdMSL2986WXWqOiF15Ivl9CUy64wPpFZFre\nhohI0G6+GX73O9vUbvvt439dcbElK06cmPy5KyoqKCwsBCj03lckf6SQcg6890u997NiN2AutrQw\nv6HAINNdfDGsXWs1qpkg1TLGmFtugX//O7zAAGw97ZNP7PqJiOSy55+39vuJBAZg+W3/+pf11skE\n6eyQmIGVnPHr1cvWhW69NTM6JgYVHIAtT4TpwAPtviKlOFZEJLN9/TW88UZiSwoxJ51kXWr/+c/g\nx5WMtAQH3vtF3vvm3vuP0nG+sIwbBwsXwtNPRz2S1HscpFO/fhZFK+9ARHLZCy9YU7nGShgbsuuu\ncMghmVO1oL0VEjBwoE0X3XRTtB2ttmyxJMKgZg7C1rw5FBSoYkFEctvzz8OAAdCzZ3KvP/lk28Fx\nzZpgx5UMBQcJGjcOysvhP/+JbgzLl1t0mi3BAWj7ZhHJbVVVljOQzKxBzE9+Yh/+Jk0KblzJUnCQ\noBEjrB/2TTdFN4ZYQ6FYh8NsUFRk5T3ZsBuZiEii3n3XKhSSyTeI6d4dDj00M5YWFBwkyDmbPZg8\n2bbgjMKtt8JBB8Gee0Zz/mQUFdl9eXm04xARCcPzz8NOO9nv5lSccoqVfq9aFcy4kqXgIAmnnmqd\nBaNoqfz227akceWV4ZYfBm2PPaBdOy0tiEhuev55OPpoy7FKxYknWsv5Z58NZlzJUnCQhFat4KKL\n4NFHbf0/nW64wbL/R49O73lT1awZFBYqOBCR3LN4sTWTSyXfIKZrVzj8cHjyydSPlQoFB0n6+c9t\nb4K77krfOWfNskSVK64IvzdBGJSUKCK5qKwMWrSAI48M5ngnnwyvvAIrVwZzvGRk4VtMZmjf3gKE\ne+9N32YZN9xgtbDx9t7ONEVFFmF/+WXUIxERCc7zz1siYYcOwRzvhBPs/plngjleMhQcpOCii2D9\nerj//vDPtWgRPP647YXQqlX45wtDLClRswcikiu+/dY+5adSpVBXly5wxBHRVi0oOEhBz56WnHj7\n7bB5c7jnuvVWS+g799xwzxOmPn2gY0cFByKSO155Bb77Lph8g5pOPtmSz1esCPa48VJwkKJx42yq\n/B//CO8cX30F990HF16YGTtCJss5K/N5662oRyIiEoznn4fddw++tPz44y23LKqlhRbRnDZ3DBhg\nSSg33WQZpps2wcaNdl/3z5s3W+/sRNel7rrL3lgvvDCUf0JaDR0K115r12W77aIejYhI8ry34OCk\nk4IvLe/cGYYNs6WFX/0q2GPHQ8FBAC67DIYPt94HTenfH6ZOtWYZ8Vi3zoKDn//c/rNku2HD4PLL\nrV/D4YdHPRoRkeRNn2773ASZb1DTKafA2WdbyXz37uGcoyEKDgIwbBi8/DJs2GCfhlu1+v59q1ZW\nlnLUUdYo4+WXYccdmz72ffdZgHDJJeH/O9JhwAALjF56KX+Dg8ces41VLrgg6pGISCrKyuz3+KGH\nhnP80aOtRPKpp+DXvw7nHA1xPsrtBetwzhUA5eXl5RQUFEQ9nFB88IG9KRYWWgvm1q0bfu7GjdC3\nry1bPPhg2oYYulNPtX0Wpk2LeiTp9/XXlpi5ebMlGmVzDolIvisuthnjp54K7xyjRtmHiTfeaPq5\nFRUVFBYWAhR67ytSOa8SEtNs4EBbo3r7bXuT3LKl4ec+9hh8/rlNw+eS4cOtYiETtiVNtzvvtBmm\nb78NN4lVRML15Ze22VJYSwoxJ58Mb74JS5aEe566FBxE4NBD4emnbUrqnHOsj3ZdVVVw441w3HGW\np5BLhg2zRJ5XXol6JOlVWQm33QbnnWeJmbk0GySSb/71L7s/6qhwzzN6tC1Phzk7UR8FBxE5+miY\nMAEeeQTGjrU3y5omToRPPrFWybmmVy/biGnKlKhHkl533mn10FdcYUlGr78O8+ZFPSoRSUZZGRx4\noO2FEKZ27eDHP05/QyQFBxEqKYF77rE3jf/+722Pew9//jMMGQIHHxzd+MI0bJglJeaLykprZPXz\nn0O3bjYj1L49PPRQ1CMTkWS8/rotkabDySfbEsbChek5Hyg4iNx558Gf/mS1/3feaY+98oqtyV95\nZbRjC9Pw4fDZZ7BgQdQjic+WLTab01iOSGNiuQaxmaA2bSw4fPhhW0ISkeyxapUlFO+/f3rON2qU\nJa+nc2lBwUEGuPJK67R40UW2zPDnP1viYrqi0igMGWLdv7JlaeEf/7COZddck/hrY7kGv/hF7Vrl\nMWNg6VIraxWR7DFzpt3vs096zrfjjtYp8cwz03M+UHCQEZyz5MNzzoGf/czeMH/zm+A7bmWSDh1s\nvS5bgoOyMutVMX48/Pvfib32rrusOqFu/siBB8LeeysxUSTbzJhh/Qf22CN95zzqqPDzG2pScJAh\nnIO//tXKGw84YNuWnbls+HD71FxftUYmqaqygODSS+0H9Iwz7BN/PGK5BnVnDcC+52PGwLPP5mdZ\np0i2mjkT9tore3fIjYeCgwzSvLn1Nnj/fftzrhs2zNbuPvww6pE0bto0G+fIkVZh0qaNBXHx7MTZ\n0KxBzBlnWB5DaWmwYxaR8MyYkb4lhagoOMhA+RAYgHUX2377zK9aKCuDTp2scmSnneCJJ+Cdd+B3\nv2v8dWvXbqtQaKgv+i67WFmrlhZEsoP3NnOw775RjyRcCg4kMq1awY9+lPl5B2VlVmccC9oOOcRy\nD264wb7WkKZmDWLGjLHZohkzghuziITjiy9sJlEzByIhGj7c6oU3bIh6JPVbtsyWPY45pvbjl15q\nj511Fixe/P3XrV0Lt9xiswZN7dZ5zDE2I6HZA5HMF6tU0MyBSIiGDbMNpt58M+qR1O9f/7KSyxEj\naj/erJn1KNhhh/rzD+66C9avj6/DZatWlnvw6KPx5TGISHRmzLB2xj/4QdQjCVdowYFzbqFzbmuN\nW5VzLse2EJJU7buvrbtnat5BWRkMGgSdO3//a507W0vT996Dq67a9njNXIOmZg1ixoyxjVwmTw5m\n3CISjpkzbb+bXM8NC3PmwANXA12BXYBuwF0hnk+ykHM2e5CJeQcbN9q46i4p1FRcbE2rbr4ZnnvO\nHrv7bvjmm8Q6XO6/PxQUaGlBJNPlQ6UChL+s8I33fqX3/svqW4auLEuUhg2DDz6Ar76KeiS1vf66\nvck3FhwAXHKJtTf96U/tF0e8uQZ1jRljMxVffpn8mEUkPPlSqQDhBwdXOue+cs5VOOfGOedyfCJG\nkpGpWziXldkbfFP9052zDZTatbMliERnDWJOO81yGR59NKnhikjIli61ZUPNHKTmDuBU4HDgL8BV\nwA0hnk+yVI8etoaXaXkHkydbD4J42lh36mT5Bxs3JjdrEDvG6NG2tFB3C28RiV6+VCoAtEjkyc65\n8UBj+dce6O+9/9R7f3uNx2c45zYBf3XO/cZ732hO9tixY2nfvn2tx0pKSigpKUlkuJJFhg+HSZPs\nTTET9pSYNw8+/dT2vIjXwQfDnDnQs2fy5x0zxgKS8nIoKkr+OCISvBkzrHFbr15RjwRKS0sprdNa\ntbKyMrDjO5/ARxTnXGegnrztWuZ777+3sa1zbm/gY6Cf935uA8cvAMrLy8spKCiIe1yS/Z57Do49\nFubOhd13j3o0cMcdcPnl1uykbdv0nbeqCnbbDY47Dv7nf9J3XhFp2pgxNnswbVrUI6lfRUUFhYWF\nAIXe+4pUjpXQsoL3flX1rEBjt4Z2vB8IbAWUbiXfc/jhtstZplQtlJXZmNIZGICVR511Fjz+OHz3\nXXrPLSKNmzkzP/INIKScA+fcIOfcRc65/Z1zfZxzpwO3Ao9474Ob95CcseOOlsyXCXkH33wD//mP\nTe9HYcwY+PprW2YRkcywdWv+VCpAeAmJG7FkxNeAGcBvgFuAX4R0PskBw4ZZxUJVVbTjePll2LSp\n6RLGsOy5J/zwh+p5IJJJFi2yvVI0c5AC7/0H3vti730n7/0O3vt9vfc3NpWIKPlt+HD7xFxeHu04\nysrsDTrK3Iezz4YXX4T586Mbg4hsE9sYTTMHIml24IG2vBBl3oH320oYo3Taadae+bbboh2HiJiZ\nM62XSTJlytlIwYFkjJYtYciQaPMOPvrIdmKMakkhpk0buOACeOABq5gQkWjNmGGzBplQap0OCg4k\nowwbZjs0rl8fzfnLyqxC4bDDojl/Teefb0lQ99wT9UhEJJ8qFUDBgWSY4cNt2+LXX4/m/GVlNoZW\nraI5f0077WSVC3fdBRu0K4lIZKqqYPbs/Mk3AAUHkmH22svW9KJYWli1Ct55J/p8g5ouucQ2pJow\nIeqRiGS2adPg44/DOfZnn1lrdM0ciETEOfvk/uKL6d9f4IUXbBo/k4KD3XeHE06wnR6jLvEUyWQX\nXggXXxzOsfOtUgEUHEgGOukk+2H897/Te96yMhg4ELp3T+95m3LZZdZW+p//jHokIplr7lx4911b\nlgzazJlWPbTzzsEfO1MpOJCMc9RR1rr40kthS0PNuANWVWXBSNRVCvU5+GA49FC4+eaoRyKSmVav\nhjVrLJEkHOv3AAAgAElEQVR5+vTgj59vlQqg4EAykHM2jT5nDtx3X3rO+e679gsmk5YUarrsMnjr\nLbuJSG1za2zl9+abwR8/3yoVQMGBZKiCAvjpT+GaayDAXUgbVFZm1QEHHRT+uZJxzDHQrx/cdFPU\nIxHJPPPm2f2AAfDGG8Eee9Mm+OST/Mo3AAUHksH+8AfrZf6nP4V/rrIy+PGPbVfETNSsGYwbZ5sx\nffpp1KMRySzz5kHXrrYk+cYbwSYzz51ry5uaORDJED16wOWXw+23w4IF4Z1n2TJbp8zUJYWY00+3\nhKhbbol6JCKZZd482GMPGDwYVqwIdk+SWKWCggORDDJunE33X3lleOeYPNk+mY8YEd45gtC6Nfz6\n1/Dww/DFF1GPRiRzzJ1rZb/Fxfb3IPMOZs6EXXaxaoV8ouBAMtoOO8Af/whPPhleMt5bb1kJY6dO\n4Rw/SL/8JbRoAXffHfVIRDLHvHkWHHTqZJ/wg8w7iFUq5BsFB5LxzjrL3rzHjrUmRUGbNSt7fvg7\ndoRzz7X9FqLaf0Ikk6xZY91NY1usDx4cbHCQj5UKoOBAskCzZrbOPm0a/P3vwR7bewsOsumHf+xY\nq+B48MGoRyISvVilwh572P3gwbYPQhC7mX73nR0/Wz48BEnBgWSFIUNg9GjLPQhyE6LFi+Gbb2Dv\nvYM7Zth69YKTT4Zbb226SVRVFXz4IaxcmZ6xiaRbLDj4wQ/s/pBD7D6IZcg5c2y2Mps+PARFwYFk\njRtvhOXLrXohKLNm2X22/fBfdplVcDzzTO3HvbdNYv76V2tDvfPOtiTzy19GM06RsM2bB126QPv2\n9vfeva0FehBLCzNn2n02fXgISouoByASrz33hPPPt74HZ59tdc2pmjnTkh532y31Y6XTwIEwdKg1\nRTr8cHjlFXj5ZZgyBRYutH4NBx1k12vePPu69/nV/lXyw9y525YUwP6PB5V3MGMG9Oy5LfDIJ5o5\nkKxyzTXQsqXdB2HmTPtU0CwLfxLGjYP337cgqaTEplGPPdY2aFq92v5+/fVw2mlW+rhwYdQjFgle\nrFKhpsGD7Wfju+9SO3a+JiOCggPJMp06WWBw//3B7N0+a1b2ThmOGGGJmo88Yo2cZs6EO+6AUaOg\nXbttzxs0yO7ffjuacYqEqb7g4JBDrO3x+++ndux8LWMEBQeShX71K+jb13ZtTKVNajZWKtTkHFxy\nCZxxRuPbTO+0k027vvNO+sYmkg6VlZZsWzc42H9/aNs2taWF9estrydbfz+kSsGBZJ1WrSw58aWX\nrLwxWbFKhXz44R80SDMHknvqljHGtGhh3RJTCQ5iycqaORDJIqNGWTvhVMqV8ikTubjYShqDLAMV\niVrdMsaaDjnEfj8k2zgt9vuhf//kXp/tFBxIVmrRAg44ILU1xVmzsrNSIRnFxdYTobw86pGIBGfe\nPNvzoGPH739t8GDrnjh7dnLHnjHDli932CG1MWYrBQeStQoLU3uzy+ZKhUTtu6/9ktPSguSSumWM\nNR18sJX0Jru0kM+VCqDgQLJYURF88gmsXZvc6/Pph79FCzjwQAUHklvqq1SIadvW+oEkGxzkc6UC\nKDiQLFZYaPcffJD4a2OVCvmQbxBTXGzBQSoVHiKZpLHgACzvIJntmysrYenS/PnwUJ9QgwPn3DHO\nuXecc98651Y7555p+lUi8enfH9q0SS7vYPFiK1XKpx/+QYNgxQr7t4tku3XrrLlXY8HB4MFWjrhs\nWWLHjiUjauYgBM65E4EJwP8C+wE/BB4P63ySf2JJicnkHcR++PMtOAAtLUhuaKiMsabYJkyJzh7M\nnGm5SHvtldzYckEowYFzrjlwO3Cp9/4+7/1n3vs53vunwjif5K+iouRmDmbOtDXJfKhUiNl5Zyv5\nUjMkyQWx4KCxmYNu3ez/fKJ5BzNmWNDRunXy48t2Yc0cFADdAZxzFc655c65yc65PPqcJulQWGgZ\ny5WVib1u1ixblsi3jYjUDElyxbx5VsLYqVPjz0sm7yCfkpUbElZw0BdwwLXA9cAxwBrgNedch5DO\nKXmoqMjuKyoSe12+/vAXF1sCZ6ob0ohEbe7cxmcNYgYPtgZg69bFf+yZM/M73wAS3LLZOTceuKKR\np3igP9uCjj947ydWv3YMsBQ4CbivsfOMHTuW9nX2yCwpKaGkpCSR4Uoe6NcPtt/e8g6GDInvNVu3\n2szBySeHO7ZMVFwMmzdbMPXDH0Y9GpHkzZvXeL5BzODB9jP/zjswfHjTz1+yxBJ3M/3DQ2lpKaWl\npbUeq0x0CrURCQUHwM3Ag008Zz7VSwrA//em8t5vcs7NB5pc5b3tttsoKChIcGiSj5o3t1rmRPIO\nliyxSoV8KmOM2W8/q/B4+20FB5Ld5s2L7wNBv37WRfGNN5oODr77zj40dOsGRxwRzDjDUt8H5oqK\nCgpjNd4pSig48N6vAlY19TznXDmwEdgLeKv6sZZAb2BRwqMUaURhIUyeHP/z87FSIaZlSzVDkuy3\nfj18/nl8ywrOWSDcVN6B93DOObYEMXWq7Waaz0LJOfDerwP+AvzeOTfcObcncC+27PCPMM4p+auo\nyD5FfP11fM/Px0qFmoqLVbEg2S2eMsaaBg+2//ObNzf8nD/9CR5/HB5+2ALofBdmE6RxwBNYr4Np\nQE/gCO99cIsiImzrlBhvUmKsM2K+VSrEFBdbU5glS6IeiUhy4iljrGnwYJttmD69/q8//TRcfTVc\nd11+5iLVJ7TgwHtf5b2/3HvfzXvfwXs/wnuf5P5YIg3bay/bVCjevIPYhkv5KpuaIW3aFPUIJBPN\nmwft21suQTwKC2G77epfWqiogDPPhFNOgWuuCXac2Ux7K0jWiyUlxtMpMVapkI/5BjFdu0KfPpm/\ntPDRR/YGMGdO1CORTBMrY4x39m+77WypoG4zpOXL4dhjrWzxwQfzdzaxPgoOJCfE2ykxH/dUqE9s\nE6ZM9uGHlj3+8MNRj0QyTbxljDUNHmzBQWzjsW+/hdGj7c+TJlkVj2yj4EByQlERzJ8Pa9Y0/rxZ\ns+w+n5cVwJYWKipg48aoR9Kw+fPt/tFHbcZHJKap3RjrM3iw9S+YP9/+P40ZY78PnnvOShelNgUH\nkhNiSYlNLS3ke6VCTHGxrecns911uixYYMsKS5fCa69FPRrJFN9+awm1iQYHxcV2/+abcP318OST\n8MgjtiQp36fgQHLCnnvam348wUE+VyrEDBhgm8pk8tLC/Plw9NH2JjBhQtSjkUzx2Wd2n+iyQqdO\ntpw4fjz8/vdWunjCCcGPL1coOJCc0KwZFBQ0nXeQ78mIMS1b2lJMJgcHCxbYjnpnnglPPWW5IiKJ\nljHWNHiwJbiecQZceWWw48o1Cg4kZxQVNT5zEKtUyPd8g5hMbob03Xc2ddynj/0iX78eJk6MelSS\nCebNgx13hC5dEn/tL34B550H992n2cOmKDiQnFFYaJ82VzXQ4FuVCrUVF1sjpGXLoh7J9y2qbrLe\nt6/dBg/W0oKYRMsYaxo4EO6915bUpHEKDiRnNLV9cz7vqVCfTG6GFKtU6NPH7s86C6ZMsbp0yW/J\nlDFK4hQcSM7YfXebbmwo72DWLEta7NkzvePKVN26Qa9embm0sGABtGgBu+5qfz/pJMuTePzxaMcl\n0UumjFESp+BAckazZra00FDegSoVvi9TmyHNn2+BS/Pm9vcOHayT3SOPRDsuidaGDbYUpuAgfAoO\nJKcUFjY8czBzppYU6ho0yIKpTNvDYMECyzWo6ayzrKVyQ5vnSO6LLTcpOAifggPJKUVFlsz21Ve1\nH9+6FWbPVnBQV3GxdUn88MOoR1Lb/Pnb8g1iRoywDHUlJuavRLdqluQpOJCc0lCnxFilgsoYazvg\nANuUJpOWFry34KDuzEHLllBSYnkHW7ZEMzaJ1rx5tgNr165RjyT3KTiQnPKDH1jL3brBgSoV6teq\nlQVUmRQcrFkDa9d+f+YAbGlhxQqrXJD8k0oZoyRGwYHklIY6JapSoWGZ1gxpwQK7rztzAPa97d9f\niYn5SmWM6aPgQHJOfZ0SVanQsOJiy9P4/POoR2Lq9jioyTmbPXj2WVi3Lr3jkuipjDF9FBxIziks\ntByDlSu3PaZKhYZlWjOkBQugXTvbKKc+p59u7ZWffjq945Joffed/VwrOEgPBQeSc2KdEmOzB7E9\nFRQc1K9HD1tuyZSlhVilQkOzPD17wpAhqlrINwsWWLKqgoP0UHAgOadvX2uaE8s7WLzY9oBXcNCw\nTGqGVF+Pg7rOPBNefdW+t5IfVMaYXgoOJOc4V7tTYqxSQWWMDTvkEJg2DSorox5J/T0O6jrxRGjT\nBh57LD1jilm3Du680yoqJL3mzrXvebduUY8kPyg4kJxUVLRt5mDmTNtzQZUKDTvxRNi8GZ56Ktpx\nVFVZcmRTMwc77ggnnGBLC96nZ2wvvgj77gsXXQQPPZSec8o2sWREJRWnh4IDyUmFhbB0KXzxheUb\nqFKhcT16wNCh0ZcILltmQUpTMwdgSwtz5jS8l0ZQ1qyBs8+2Do177AH77QfvvhvuOeX7VMaYXgoO\nJCfVTEqMlTFK4848E/7zH/vkHpXGehzUNXSoTTGHmZg4aZLlqjz9NNx3H7z0kgUJmZK8mU9Uxphe\nCg4kJ/XuDR07wnvvqVIhXiecANtvD48+Gt0YYj0Oevdu+rktWsBpp0Fpqc02BGnlSmvVfNxxNgs1\ncyace67NPg0alFl9IfLBpk12zRUcpI+CA8lJztnswTPPqFIhXm3bwvHH29JCutbx61qwALp3h9at\n43v+WWfZJltlZcGc33t44gmbaXrxRQuU/vlP2HXXbc+J9YXQ7EH6LFhgJckKDtJHwYHkrMJC2+IX\nFBzE68wz4ZNPGt72OmwLFsSXbxCz//5WaXHddZbMmIqvv7bgqKTE+ijMmmUNl+rmqvToYcGCgoP0\nURlj+ik4kJwVyzvYccfan/ykYbF1/KgSE+vbjbEpt9wC06enXkEwdiy89prlFzz5ZOM7/w0apOAg\nnebOtdmk7t2jHkn+CCU4cM79yDm31TlXVX1f81YYxjlF6opt36xKhfjF1vGfeCL4dfx4JDpzAHDw\nwTbm3/42+f0WXn/dgosbb7Tci6YMGmT5LNo6Oj3mzbMdV5vp42zahHWp3wR2AbpV3+8C3A/M996H\nXHgkYnr1gs6dtaSQqDPPtIS8F15I73k3bLAkv0RnDgDGj7cGTn/+c+Kv3bwZfvUrCzLOPTe+1wwa\nZOP9+OPEzyeJU6VC+oUSHHjvt3jvv4zdgNXAaOCBMM4nUh/nrMztssuiHkl2GTDAavnTvbSwcKHd\nJzpzALDbbjBunC0xJFqKeccdll9w773xfzItKLBZFi0tpId6HKRfuiZpRgOdgIfSdD4RAI4+Gvr1\ni3oU2efMM63GP53tlGNljMnMHABccYWVr/7mN/G/ZskSS2a84AIYODD+17VpAwccoOAgHd57zwJH\nzRykV7qCg7OBF7z3y9N0PhFJwWmnWW15OtspL1gArVoln3TWti388Y/W9yDeN+2LL7aE1euvT/x8\nqSYlem/XOFdt2ZJaTob3NqtzyCE2U/OTnwQ3Nmma8wkUNDvnxgNXNPIUD/T33n9a4zU9gEXAT7z3\nE5s4fgFQfthhh9G+fftaXyspKaGkpCTusYpIaoYPt/X4115Lz/kuucT6FXzySfLHqKqyKpXWreGt\ntxpPRJ08GY45xoKJU09N/FyPPQZnnGF9Fjp3Tvz1f/sbXHuttYCu8+suJ5x3Hjz7LPz+95bL0aJF\n/K+NtayeONGqSP78ZwscZZvS0lJKS0trPVZZWcnUqVMBCr33FSmdwHsf9w3oDOzZxK1Fndf8DlgB\nNI/j+AWALy8v9yISrYcf9h68X7gwPec77jjvR4xI/Tivvmrjfvzxhp/z7bfe9+3r/dCh3m/dmtx5\n5s2z80yenNzrf/Qje/111yX3+ky2dav3O+/sfZ8+9m/ce2/vy8riu9bvvut9r17ed+jg/cSJoQ81\np5SXl3vsQ3qBT+C9vb5bQssK3vtV3vtPm7jVnUj6GfCw9z7FFiUikk7pbqecTI+D+hx+uLU9vuIK\nqyioz/jxtjHXPfckX+baty/stFNySwtffWXlk717w623wurVyY0hU82YAV9+aftRvP8+dOliszRH\nHrmtMVld3sNtt9kywi67wAcfwOjR6R23bBNqzoFzbijQG/jfMM8jIsFLZztl75PrcdCQG2+EFSvs\njbeuTz+FG26Ayy+HPfdM/hyxfRaSCQ7KyuzfPGmSLYXcfHPy48hEU6bY0s4hh1i/kVdftSWCxYst\nkfPcc2vvTbF6tQV0l1xiW2JPnRrf/hoSnrATEs8G3vQ1chBEJHukq53yqlXWwCiImQOwsrcLLrAZ\nghUrtj3uPZx/vrVAvuqq1M8zaJBt37x1a2KvmzTJ+irsv7+9Gd5xh33SzhVTpsDgwdv2yHDOZgFm\nzLB/68SJ9j26/noLHAYOtJmUSZMsUFJ+QfRCDQ6896d77w8L8xwiEp50tVOObdUc1MwBwO9+Z29O\nV1+97bEnn7Q3rrvvtnLEVA0aZOWeiSRRbthgDaZiU+bjxkHLlsk1cMpEmzbZ1t/Dhn3/ay1bwoUX\nWt+CX/7SqkuOOMIqVD74AI49Nv3jlfqpGaWINChd7ZRT7XFQn44drYfBAw/Ahx/C2rWW+X788db/\nIggHHmifihNZWpgyxXYKPe64beO85BLLf1i2LJhxRemdd2D9+vqDg5gOHeCmm2D2bPjf/7VlhF69\n0jdGaZqCAxFpVDraKS9YYG8YHToEe9xf/AL22svefK+5xj7l3357cMdv187acycSHEyaZLkONZtz\nXXwx7LCDfZLOdlOmQKdOllvQlL59rWSxZcvwxyWJUXAgIo1KRzvloCoV6mrZ0tawX33V1rqvu85a\nLQcpkaTEqip47rnvZ+G3a2fVFfffv22JJVtNmWJLBc2bRz0SSYWCAxFpUtjtlIOsVKjr6KOtjG7A\nAPuEHrRBgyzRLp4dId95xxIPY0sKNZ1/vn3i/u//Dn6M6VJZCdOmWQMtyW4KDkSkSWG3Uw5r5gAs\nJ2DiRHtjDmP6urjYqhXiqeiYNAl23tkqFeraYQfbF2LCBCu3zEb/+Y/NjjSWbyDZQcGBiDSpRw+r\nXAhjaWHLFqt/D2vmACyxMlZWF7R+/WxZ4O23G3+e9xakjBrV8JT7L35hDYB+//vgx5kOU6bY9zGs\nQE/SR8GBiMTlzDPtk2GiWyI3ZelSCxCy9Q2lWTObCWgq72DOHJg7t/4lhZjWra0Es7TUliqyzZQp\nmjXIFQoORCQuxx9vzWkmTQr2uGH0OEi3WFJiY50kJ02ydtRDhzZ+rDFjrDvgtdcGOsTQLVtmpYkK\nDnKDggMRicuOO9q+Bc89F+xx58+3vIBsrnMfNMjKPRurNJg0CUaMaLr5UqtWFhg88wyUlwc7zjC9\n/LLdH3FEtOOQYCg4EJG4jRplSwtr1wZ3zAULLKdhu+2CO2a6xRIMG1pa+Pxza7Mc70ZCp59uvRCu\nuSaY8aXDlCnWBnmnnaIeiQRBwYGIxG3kSOuU+OKLwR0zzEqFdOnc2fYKaCg4eO45mx0ZOTK+47Vo\nYUmJkyc3neiYCbxXvkGuUXAgInHr3Rv23TfYpYUwexykU2PNkCZNgkMPtSAiXiefbNf6d78LZnxh\nmjXLZkcUHOQOBQcikpBRo+wTbVVVMMfLhZkDsODggw9sY6Wa1q2z9fh4lxRimjWzXQtfftkaC2Wy\nKVMsV2Lw4KhHIkFRcCAiCRk5Er76ytbQU7V+vXUMzJWZgy1bLECo6YUXYOPGxIMDsF0K27eHf/87\nmDGGJbZF8/bbRz0SCYqCAxFJyMEHW9JZEEsLsez+XJg52G8/q0Sou7QwaZJ9LZl/Y/PmMGTItkqA\nTLR5M7z2mpYUco2CAxFJSPPmtlfB88+nfqxc6HEQ07IlFBXVDg42b4aysuRmDWKGDrWkxPXrUx9j\nGKZNg2++UXCQaxQciEjCRo60Dn4LF6Z2nPnzrSvgLrsEMqzI1U1KfP11WLOm8a6ITRk61IKMN95I\nfXxhmDLFttouKIh6JBIkBQcikrAjj7RPyqkuLSxYYBUQzXLkN9GgQbBkiXULBFtS2HXX1N44+/WD\nbt3sTTgTaYvm3JQjP5Iikk7t2sGPfpT60kKuVCrEDBpk9+++a7X/kyZZUqFzyR/TOZs9yMS8g3Xr\nbKZESwq5R8GBiCRl1ChLRFu3Lvlj5EqPg5ju3aFnT3vD/Ogj26QqlSWFmGHD4MMPYdWq1I8VpKlT\nrUJDwUHuUXAgIkkZORI2bUq+W6L3uTdzANvyDiZO3DbDkqqhQ+16vfpq6scK0pQpsNtusPvuUY9E\ngqbgQESS0rcv7L138ksLK1fCt9/m1swBWHDw/vvw9NNw9NHWHChVu+5qey1k2tLCSy/ZrEEqyyaS\nmRQciEjSRo2yUr1kuiXOn2/3uThzsGEDfPxxMEsKMZmWd/D55zBzJgwfHvVIJAwKDkQkaaNG2QzA\ne+8l/tpc6nFQ08CBVsnRsiUcdVRwxx06FObOhcWLgztmKrRFc25TcCAiSRs0yDYTSqakcf58e227\ndsGPK0pt2kBhob2ZB/lvGzLEpu8zZfZgyhQYMAB23jnqkUgYFByISNKaN7d19WSCg1yrVKjpiSfg\ngQeCPWanTtYvIROCA23RnPsUHIhISkaOtPX1RYsSe10uVirE9OpljYuCFss78D74Yyfik0+s0ZOC\ng9wVWnDgnNvDOTfRObfSOVfpnHvdOXd4WOcTkWiMGAEtWiRetZDLMwdhGToUVqyA2bOjHceUKZZT\nceih0Y5DwhPmzEEZ0Bw4HCgApgPPO+e0QiWSQ9q3T7xb4ubNlliXqzMHYRk82Eojo26lPGUK/PCH\nsMMO0Y5DwhNKcOCc6wzsDvzZez/Te/8ZcCWwPbBvGOcUkeiMHAmvvGK788VjyRLYulUzB4nafnso\nLo4272D+fOtvcOSR0Y1BwhdKcOC9XwXMAc5yzm3vnGsB/BL4AigP45wiEp1Ro6xb4ksvxff8XO1x\nkA7Dhlnb6i1b0n/uzZuhpMR20bzggvSfX9InzGWF4dhywjpgA3AR8GPvfWWI5xSRCPzgB9C/f/xL\nCwsW2E6Mu+0W7rhy0dChsHYtlEfwMeuaa6CiAkpLc68EVWpLKDhwzo13zm1t5FblnNuz+un3YDMF\nhwAHAhOxnIOuwf4TRCQTjBxp3RK3bm38eR9+CH/5i23V3LJlWoaWUw48EHbcMf1LCy+/DDfcAH/4\nAxx0UHrPLennfAI1MdW5BJ2beNp84EfAv4EO3vv1NV7/KXC/9/7GBo5fAJQfdthhtG/fvtbXSkpK\nKCkpiXusIpJer78Ohx1mmw4dfPD3v75yJVx9Ndx3H/TrB3/7myXYSeJGjbJ9KdIVIKxcaQ2P9t7b\nNtpqpiL4yJWWllJaWlrrscrKSqZOnQpQ6L2vSOX4LRJ5cnUuQZObhjrn2gAeqPsZYitxzFbcdttt\nFBQUJDI0EYlYcTF07GhLCzWDg82b4X/+B667zv5+223wq19p1iAVQ4fClVfaHg5t2oR7Lu/h7LPt\n+zhhggKDTFHfB+aKigoKCwsDOX5Y3+a3ga+BCc65/at7HtwE9MZKHEUkx7Ro8f1uiS++aJ84L7kE\nTj3V9ga46CIFBqkaNgw2boQ33wz/XHffbQHfQw9B9+7hn08yQ5jVCj8G2gIvA+8BPwSO9d5/HMY5\nRSR6o0bB9OmWTT96tDVI6tLFktj+8hf7s6Run32ga9fwlxWmT4dx4+DXv4Zjjgn3XJJZElpWSET1\nekeAe5KJSKaLdUscMgR69oS//x1OOsk2DJLgOGe7IYYZHKxfb7M9/ftbIqLkl9CCAxHJPx06WNJh\ns2Zw6aXWtEfCMXSoBV9r1liuR9DGjrX9MsrLoXXr4I8vmU3BgYgE6tprox5Bfhg61MpGX3sNjj8+\n2GM/9ZRVldx3n80cSP5R3qmISBbq3duaTwW9tLBoEfzXf9ly0DnnBHtsyR4KDkREslRsC+egbNkC\np59u3Q//9jfliuQzBQciIllq6FCYMweWLQvmeJddZk2sHnvM8kckfyk4EBHJUkOG2P0rr6R+rPvv\nh9tvhzvuUOdKUXAgIpK1unSxJlOpLi1MnWpdK3/5Szj//GDGJtlNwYGISBYbOhSmTLE2x8lYsABO\nOMFmC+64I9ixSfZScCAiksWGDbOcg08/Tfy1a9daV8sOHeAf/1Bba9lGwYGISBY79FDrSvn444nN\nHlRVWWXCkiW2H0bnpvbblbyi4EBEJIu1bQvnngvXXw/Dh8PMmfG97qqrYPJkeOIJNTqS71NwICKS\n5e69F8rKYPFiS1AcOxYqKxt+/oQJcOONcPPNcJR2wJF6KDgQEckBRx8NH38Mf/yjtT3ec0948EFr\nsVzT229bB8Szz4aLL45mrJL5FByIiOSI7baDK66ATz6xRMWzz4biYpg2zb6+eDEcdxwcfLDNNqgD\nojREwYGISI7p0cO6HE6dChs3WjBwzjkwejS0aQNPPw2tWkU9Sslk2pVRRCRHHXqobbn817/aVtqb\nN8Nbb1nzJJHGaOZARCSHNW9u3Q8/+ww++gj22y/qEUk20MyBiEge6NjRbiLx0MyBiIiI1KLgQERE\nRGpRcCAiIiK1KDgQERGRWhQciIiISC0KDkRERKQWBQciIiJSi4IDERERqUXBgYiIiNSi4EAoLS2N\negh5R9c8/XTN00/XPHuFFhw45wqccy8659Y451Y65/7qnNshrPNJ8vQDnH665umna55+uubZK5Tg\nwDnXDXgJ+BQ4CPgxsA/wUBjnExERkeCEtfHSSGCT9/6C2APOufOAj5xzfb3380M6r4iIiKQorGWF\n7YBNdR77rvp+cEjnFBERkQCENXPwCnCLc24ccAfQFhgPeKBbI69rDTB79uyQhiX1qayspKKiIuph\n5HOi+EcAAAU3SURBVBVd8/TTNU8/XfP0qvHe2Trlg3nv475hb/BbG7lVAXtWP/dUYDmwGdgA3AB8\nDlzWyPFPwwII3XTTTTfddNMtudtpiby313dz1W/KcXHOdQY6N/G0+d77LTVe0wVYX/3XtcAp3vun\nGzn+CGAh25YhREREpGmtgd7AC977VakcKKHgIKUTOXc2tsTQw3u/Ni0nFRERkYSFlXOAc+584C3g\nG+BI4EbgcgUGIiIimS204ADrb3Adlow4B/gv7/3jIZ5PREREApC2ZQURERHJDtpbQURERGpRcCAi\nIiK1ZExw4Jw73zm3wDm3wTn3jnPuwKjHlEucc4c65/7pnFvmnNvqnDu2nudc75xb7pz71jn3knNu\n9yjGmgucc79xzk1zzq11zn3hnHvWObdnPc/TNQ+Ic+4859x051xl9e0t59yP6zxH1ztEzrkrq3+/\n3FrncV33gDjnrq2+xjVvs+o8J+XrnRHBgXPuFOAW4FpgIDAdeME5t1OkA8stOwAfAr/CmmTU4py7\nArgA+DmWTLoe+x60Sucgc8ihwF3AwcAwoCXwonOuTewJuuaBWwJcARQAhVin1knOuf6g6x226g90\nP8d+f9d8XNc9eDOArsAu1bf/35YgsOudahelIG7AO8AdNf7ugKVY6WPk48u1G9bN8tg6jy0Hxtb4\nezuss+XJUY83F27ATtXXfbCueVqv+ypgjK536Ne5LfAJcATwKnBrja/pugd7ra8FKhr5eiDXO/KZ\nA+dcSyzKfzn2mLd/0RSgOKpx5RPnXB8s+qz5PVgLvIu+B0HpgM3YrAZd87A555o5504Ftgfe0vUO\n3f8Az3nvX6n5oK57aPaoXiL+zDn3qHOuJwR7vcPscxCvnYDmwBd1Hv8C2Cv9w8lLu2BvXPV9D3ZJ\n/3Byi3POAbcDb3jvY2uDuuYhcM7tC7yNtZFdBxzvvf/EOVeMrncoqoOwA4Cier6s/+fBewf4GTZT\n0w3rJzS1+v9+YNc7E4IDkVx3D7A3cEjUA8kDc4ABQHvgJ8AE59xh0Q4pdznndsUC32He+81Rjycf\neO9fqPHXGc65acAi4GTs/38gIl9WAL7CdnPsWufxrsCK9A8nL63A8jz0PQiYc+5u4GjgcO/95zW+\npGseAu/9Fu/9fO/9B97732LJcReh6x2WQqALUOGc2+yc2wz8CLjIObcJ+8Sq6x4i730l8CmwOwH+\nP488OKiONsuBobHHqqdhh2J7M0jIvPcLsP84Nb8H7bBMe30PklQdGIwGhnjvF9f8mq552jQDttP1\nDs0UYD9sWWFA9e194FFggPd+PrruoXLOtcUCg+VB/j/PlGWFW4GHnHPlwDRgLJZI9FCUg8olzrkd\nsP9Arvqhvs65AcBq7/0SbGrwaufcPGzL7P/GKkYmRTDcrOecuwcoAY4F1jvnYpF8pfc+th25rnmA\nnHN/Av4FLAZ2BE7HPsUeWf0UXe+Aee/XA3Vr7NcDq7z3s6sf0nUPkHPuJuA5bCmhB/B7YDPwRPVT\nArneGREceO+frO5pcD02/fEhMMJ7vzLakeWUIqzEyFffbql+/GHgbO/9jc657YG/Ypn1rwNHee83\nRTHYHHAedp1fq/P4GGACgK554HbG/j93AyqBj4AjYxn0ut5pU6uPiq574HYFHgc6AyuBN4BB3vtV\nENz11sZLIiIiUkvkOQciIiKSWRQciIiISC0KDkRERKQWBQciIiJSi4IDERERqUXBgYiIiNSi4EBE\nRERqUXAgIiIitSg4EBERkVoUHIiIiEgtCg5ERESklv8DtdvdkP+T3ckAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1060cbb00>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(np.random.randn(50).cumsum())"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python [py35]",
   "language": "python",
   "name": "Python [py35]"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
